#ifndef CONFIGMANAGER_H
#define CONFIGMANAGER_H

#include "configdef.h"

#include <QObject>
#include <QSettings>
#include <QVariant>
#include <QStringList>
#include <QMap>
#include <QMutex>

// settings 分组 enum
enum ConfigGroup {
	GeneralGroup,      // 通用设置
    InputMethodGroup,  // 输入法设置
    AppearanceGroup,   // 外观设置
    ShortcutGroup      // 快捷键设置
};

class ConfigManager : public QObject {
	Q_OBJECT

public:
	static ConfigManager* getInstance(QObject* parent = nullptr);
	// delete copy | =  禁止拷贝构造与赋值（防止多实例）
	ConfigManager(const ConfigManager&) = delete;
    ConfigManager& operator=(const ConfigManager&) = delete;

	// funcs

	// 输入法config
	InputMethodConfig::Data getInputMethodConfig() const;
	void setInputMethodConfig(const InputMethodConfig::Data& config);

	// 通用config
	GeneralConfig::Data getGeneralConfig() const;
    void setGeneralConfig(const GeneralConfig::Data& config);

	// Theme config
	AppearanceConfig::Data getAppearanceConfig() const;
    void setAppearanceConfig(const AppearanceConfig::Data& config);

	// 快捷键config
	ShortcutConfig::Data getShortcutConfig() const;
    void setShortcutConfig(const ShortcutConfig::Data& config);

	// base func
	bool saveConfig();       // 保存配置到 config.ini
    bool loadConfig();       // 从 config.ini 加载配置
    void restoreDefaults();  // 恢复默认配置
    QString getConfigFilePath() const;  // 获取配置文件路径

	QVariant getValue(ConfigGroup group, const QString& key, const QVariant &defaultValue = QVariant());
	void setValue(/*ConfigManager::*/ConfigGroup group, const QString& key, const QVariant &value);

	// ------- dic config ---------
	// 系统JSON词库配置  兼容原有词库/MySQL配置接口
	// （基于结构化数据实现，消除字符串key依赖）
    QString getSystemDictPath() const { return getInputMethodConfig().baseDictPath; }
    bool isSystemDictEncrypted() const { return getInputMethodConfig().baseDictEncrypted; }
    QString getMySQLHost() const { return getInputMethodConfig().mysqlHost; }
    int getMySQLPort() const { return getInputMethodConfig().mysqlPort; }
    QString getMySQLDbName() const { return getInputMethodConfig().mysqlDbName; }
    QString getMySQLUser() const { return getInputMethodConfig().mysqlUser; }
    QString getMySQLPassword() const { return getInputMethodConfig().mysqlPassword; }
    bool isUserWordEncrypted() const { return getInputMethodConfig().userWordEncrypt; }
    bool isAutoAddUserWord() const { return getInputMethodConfig().autoAddWord; }
    int getAutoAddThreshold() const { return getInputMethodConfig().autoAddThreshold; }

	// OpenCC 词典path
	QString getOpenCCDictPath() const { return getInputMethodConfig().openccDicPath; }

	// baidu Api key
	QString getBaiduApiAppId() const { return getInputMethodConfig().baiduApiAppId; }
    QString getBaiduApiSecretKey() const { return getInputMethodConfig().baiduApiSecretKey; }

	// opencc | baidu API setter
	void setOpenCCDictPath(const QString& path);
	void setBaiduApiConfig(const QString& encryptedAppId, const QString& encryptedSecretKey);

signals:
	void configChanged(ConfigGroup group, const QString& key, const QVariant &value);
	// 信号分细一点
	void inputMethodConfigChanged(const InputMethodConfig::Data& newConfig);
    void generalConfigChanged(const GeneralConfig::Data& newConfig);
    void appearanceConfigChanged(const AppearanceConfig::Data& newConfig);
    void shortcutConfigChanged(const ShortcutConfig::Data& newConfig);
	
	void doublePinyinSchemeChanged(const QString &scheme);
	void fuzzyPinyinChanged(bool enabled);
	void candidateCountChanged(int count);

private:
	// 构造
	explicit ConfigManager(QObject *parent = nullptr);
    ~ConfigManager() override;

	// 单例
	static ConfigManager* m_instance;
    static QMutex m_mutex;

private:
	// 私有funcs
	void initDefaultConfig();
	QString groupToString(ConfigGroup group) const;

	// 成员变量  
	QMap<ConfigGroup, QVariant> m_configData;	// ConfigGroup → 结构化配置数据（用QVariant包装）
    QSettings* m_settings;      // 配置文件读写实例（ini格式）
    QString m_configPath;       // 配置文件路径

};

#endif	// CONFIGMANAGER_H